package com.hundsun.cprs.yyt.service.goods.service;

import com.hundsun.cprs.yyt.service.goods.domain.GoodsSpecs;
import com.hundsun.cprs.yyt.service.goods.dto.GoodsPublishInfo;

import java.util.List;

public interface GoodsSkuService {

    void insert(GoodsSpecs record);
    
    void insertList(List<GoodsSpecs> recordList);

    GoodsSpecs selectByPrimaryKey(Long id);

    void updateSkuRecord(GoodsSpecs record);

    List<GoodsSpecs> selectGoodsSpecsList(Integer goodsId,String areaCode);

    void delete(Long skuId);
    
    /**
     * 预占库存
     * @param skuId         SKU规则信息
     * @param amount        待预占的库存数量
     */
    void addAllocatedStock(Long skuId,Integer amount);
    
    /**
     * 解除预占，同时扣减实际库存
     * @param skuId         SKU规格信息
     * @param amount        待扣减的预占库存数量
     * @param stockAmount   待实际扣减的库存数量
     */
    void deductGoodsStock(Long skuId,int amount,int goodsStock);
    
    
    /**
     * 专场商品出库,仅仅影响影响商品库存字段
     * @param skuId
     * @param goodsStock
     */
    void deductGoodsStock(Long skuId,int goodsStock);
    
    /**
     * 专区商品入库,以商品维度增加全部SKU的总库存
     * 该方法仅限零售区使用
     * @param goodsId       商品ID
     * @param areaCode      专区代码
     * @param goodsStock    入库商品数
     */
    void addGoodsStock(Long goodsId,String areaCode,int goodsStock);
    
    /**
     * 专区商品入库,针对指定商品规格入库
     * @param skuId
     * @param goodsStock
     */
    void addGoodsStock(Long skuId,int goodsStock);
    
    /**
     * 专区商品出库
     * @param goodsId
     * @param areaCode
     * @param goodsStock
     */
    void reduceGoodsStock(Long goodsId,String areaCode,int goodsStock);
    
    /**
     * 更新冻结库存
     * @param goodsSpecs
     */
    void updateFrozenStock(GoodsSpecs goodsSpecs);
    
    /**
     * 根据areaCode，goodsId,plateCode确定唯一一条sku
     * @param areaCode,goodsId,plateCode
     *
     * */
    GoodsSpecs selectDistinctSku(String areaCode,int goodsId,String plateCode);

    /**
     * 批发区商品上架并新增sku
     * @param goodsPublishInfo
     *
     * */
    void crateWholesaleSku(GoodsPublishInfo goodsPublishInfo);

    /**
     * 批发区商品规格调整
     * @param goodsPublishInfo
     *
     * */
    void editWholesaleSku(GoodsPublishInfo goodsPublishInfo);

    /**
     * 根据商品编码查找到该商品所有的skuId集合
     * @param goodsCode
     *
     * */
    List<Long> selectSkuIdListByGoodsCode(String goodsCode);

    /**
     * 重载方法
     *
     *
     * */
    List<GoodsSpecs> selectGoodsSpecsList(Integer goodsId,String areaCode,String plateCode);

}
